package com.sixth.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sixth.anotation.PreAuthoritory;
import com.sixth.core.annotation.OperaLog;
import com.sixth.core.entity.User;
import com.sixth.core.util.JWTUtil;
import com.sixth.core.util.OSSUtil;
import com.sixth.core.util.WebUtil;
import com.sixth.core.vo.R;
import com.sixth.system.service.UserService;
import com.sixth.system.vo.PostDataVo;
import com.sixth.system.vo.UserVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 用户管理控制器
 *
 * @Author: 闫克起
 * @Description: 提供用户相关的API接口
 * @Date: Create in 11:56 2024/8/12
 */
@Api(tags = "用户管理")
@RestController
@RequestMapping("/system/user")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 通过名称查询用户信息
     * @param name 用户名
     * @return 用户信息
     */
    @ApiOperation(value = "通过名称查询用户信息", notes = "根据用户名查询用户详细信息")
    @GetMapping("/getByName/{name}")
    public R<User> getByName(@PathVariable String name) {
        return userService.selectByName(name);
    }

    /**
     * 根据id获取用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    @ApiOperation(value = "根据id获取用户信息", notes = "根据用户ID查询用户详细信息")
    @GetMapping("/getUserById/{userId}")
    public R<User> getUserById(@PathVariable Long userId) {
        return userService.getUserById(userId);
    }

    /**
     * 修改用户信息
     * @param user 用户对象
     * @return 修改结果
     */
    @ApiOperation(value = "修改用户信息", notes = "根据用户对象更新用户信息")
    @OperaLog(value = "修改用户信息", type = 3)
    @PostMapping("/update")
    public R update(@RequestBody User user) {
        return userService.updateById(user);
    }

    /**
     * 获取当前用户信息
     * @return 当前用户信息
     */
    @ApiOperation(value = "获取当前用户信息", notes = "从请求头中解析出当前用户的用户名并查询用户信息")
    @GetMapping("/info")
    public R<User> info() {
        String token = WebUtil.getRequest().getHeader("token");
        Object username = JWTUtil.getInfo(token).get("username");
        return userService.selectByName(username.toString());
    }

    /**
     * 分页查询用户
     * @param userVo 查询条件
     * @return 用户列表分页信息
     */
    @ApiOperation(value = "分页查询用户", notes = "根据查询条件分页查询用户列表")
    @PostMapping("/listByPage")
    public R<IPage<User>> list(@RequestBody UserVo userVo) {
        return userService.selectByPage(userVo);
    }

    /**
     * 查询所有用户
     * @return 用户列表
     */
    @ApiOperation(value = "查询所有用户", notes = "查询系统中的所有用户")
    @GetMapping("/listAll")
    public R<List<User>> listAll() {
        return userService.listAllUser();
    }

    /**
     * 逻辑删除单行用户
     * @param userId 用户ID
     * @return 删除结果
     */
    @ApiOperation(value = "逻辑删除单行用户", notes = "根据用户ID逻辑删除用户")
    @OperaLog(value = "删除用户", type = 3)
    @GetMapping("/delete/{userId}")
    public R delete(@PathVariable Long userId) {
        return userService.removeById(userId);
    }

    /**
     * 批量删除用户
     * @param userIds 用户ID数组
     * @return 删除结果
     */
    @OperaLog(value = "删除用户", type = 3)
    @ApiOperation(value = "批量删除用户", notes = "根据用户ID数组批量删除用户")
    @GetMapping("/batchDelete")
    public R batchDelete(Long[] userIds) {
        return userService.batchDelete(userIds);
    }

    /**
     * 添加用户
     * @param user 用户对象
     * @return 添加结果
     */
    @ApiOperation(value = "添加用户", notes = "根据用户对象添加新用户")
    @OperaLog(value = "添加用户", type = 1)
    @PostMapping("/add")
    public R add(@RequestBody User user) {
        return userService.add(user);
    }

    /**
     * 查询排班医生
     * @param params 查询参数
     * @return 排班医生列表
     */
    @ApiOperation(value = "查询排班医生", notes = "根据查询参数查询排班医生列表")
    @PostMapping("findSchedulingUser")
    public R<List<User>> findSchedulingUser(@RequestBody Map<String, Object> params) {
        return userService.selelctSchedulingUser(params);
    }

    /**
     * 根据手机号查询用户名
     * @param phone 手机号
     * @return 用户名
     */
    @ApiOperation(value = "根据手机号查询用户名", notes = "根据手机号查询对应的用户名")
    @GetMapping("/getByPhone/{phone}")
    public R<User> getByPhone(@PathVariable String phone) {
        return userService.selectBytel(phone);
    }
    @PostMapping("/updatePassword")
    public R updatePassword(@RequestBody PostDataVo postDataVo) {
        return userService.updatePasswordById(postDataVo);
    }

    @ApiOperation(value = "上传图片", notes = "上传图片到OSS并返回URL")
    @PostMapping("/uploadOos")
    public R upload(@RequestParam("file") MultipartFile file) {
        String url = OSSUtil.uploadOss(file);

        return R.ok(url);
    }

}
